
import { defineStore } from 'pinia';


/** 列表 key name */
type ListName = 'selectWordlist' | 'learningNewlist' | 'correctlist' | 'afterStudylist';

/** 词汇相关数据 */
export default defineStore('word', {
    state: () => ({
		/** 参数 */
		query: {
			box: 0,			/** 第几个格子 */
			learnId: 0,		/** 学习 id */
			courseId: 0,	/** 课程 id */
			learnType: 0	/** 学习类型 */
		},
		
		/** 课程相关数据 */
		course: {
			index: 0,		/** 当前课程所在的索引 */
			list: []		/** 课程列表 */
		},
		
		/** 剪子盒数据 */
		shearsBox: {
			index: 0,		/** 当前分组所在的索引 */
			list: [],		/** 分组列表 */
			mixGroup: 0,	/** 最小分组 */
			nextIndex: 0	/** 下一组索引 */
		},
		
		
		
		/** 选择的正确词汇列表 */
		correctlist: [],
		
		/** 学习后的列表 */
		afterStudylist: [],
		
		/** 选择的词汇列表 */
		selectWordlist: [],		
		
		/** 学新词汇列表 */
        learningNewlist: [],	
		
		
		/** 倒计时开始时间 */
		countdownTime: '',
    }),
	
	actions: {
		/** 
		 * @description 设置参数
		 * @param { 'box' | 'learnId' | 'courseId' | 'learnType' | { box?: number, learnId?: number, courseId?: number, learnType?: number } options 设置参数的 key 或者 key/value;
		 * @param { number } value 设置参数的 key 的值;
		*/
		setQuery(options: 'box' | 'learnId' | 'courseId' | 'learnType' | { box?: number, learnId?: number, courseId?: number, learnType?: number }, value?: number) {
			typeof options === 'string' ? this.query[options] = Number(value) : this.query = { ...this.query, ...options };
		},
		
		/** 重置参数 */
		resetQuery() {
			this.query = {
				box: 0,
				learnId: 0,
				courseId: 0,
				learnType: 0
			};
		},
		
		
		/** 
		 * @description 设置课程相关
		 * @param { 'index' | 'list' } key 课程数据名
		 * @param { number | Record<string, unknown>[] } value 课程数据值
		*/
		setCourse(key: 'index' | 'list', value: number | Record<string, unknown>[]) {
			this.course[key] = value;
		},
		
		
		/** 
		 * @description 设置剪子盒相关数据
		 * @param { 'mixGroup' | { mixGroup?: number } options 设置参数的 key 或者 key/value;
		 * @param { number } value 设置参数的 key 的值;
		 */
		setShearsBox(options: 'mixGroup' | 'index' | 'list' | 'nextIndex' | { mixGroup?: number, index?: number, nextIndex?: number, list?: Record<string, unknown>[] }, value?: number) {
			typeof options === 'string' ? this.shearsBox[options] = Number(value) : this.shearsBox = { ...this.shearsBox, ...options };
		},
		
		
		/** 
		 * @description 设置列表
		 * @param { ListName } key 列表名
		 * @param { Record<string, unknown>[] } list 列表数据
		*/
		setlist(key: ListName, list: Record<string, unknown>[]) {
			this[key] = list;
		},
		
		/**
		 * @description 添加列表项
		 * @param { ListName } key 列表名
		 * @param { Record<string, unknown> } item 列表项数据
		 * @param { boolean } options.isExistItDelete 是否存在就删除
		 * @param { boolean } options.isAppend 是否添加
		*/
		setlistItem(key: ListName, item: Record<string, unknown>, options?: { isExistItDelete: boolean, isAppend: boolean }) {
			const { isExistItDelete = true, isAppend = true } = options || {};
			const findIndex = this[key]?.findIndex?.((find: Record<string, unknown>) => find.id === item.id);
			!!~findIndex ? isExistItDelete && this[key]?.splice(findIndex, 1) : isAppend && this[key]?.push(item);
		},
		
		
		/** 
		 * @description 设置倒计时开始时间
		 * @param { string } time 倒计时开始时间
		*/
	   setCountdownStratTime(time: string) {
		   this.countdownTime = time;
	   },
	}
});